Enhanced assert_broadcasts, file support for Logger outputs and more! | This Week in Rails
ActionMailerに関する変更です
ActionMailer::TestHelper に assert_emails というメソッドがあります
このメソッドは送信されたメールの数を検証するメソッドです
code:rb
def test_emails
assert_emails 0
ContactMailer.welcome.deliver_now
assert_emails 1
ContactMailer.welcome.deliver_now
assert_emails 2
end
ブロックが渡された場合、そのブロック内でのメール送信件数を検証します
code:rb
def test_emails_again
assert_emails 1 do
ContactMailer.welcome.deliver_now
end
assert_emails 2 do
ContactMailer.welcome.deliver_now
ContactMailer.welcome.deliver_later
end
end
今回のプルリクエストでは、この assert_emails メソッドにブロックを渡した場合の戻り値が変更されています
変更前は assert_equal の結果を返していました
変更後は Mail::Message クラスのインスタンス、あるいはその配列を返します
これにより、メールのタイトルや本文を扱えるようになって便利です
code:rb
def test_emails_more_thoroughly
email = assert_emails 1 do
ContactMailer.welcome.deliver_now
end
assert_email "Hi there", email.subject
emails = assert_emails 2 do
ContactMailer.welcome.deliver_now
ContactMailer.welcome.deliver_later
end
assert_email "Hi there", emails.first.subject
end
ActiveRecordに関する変更です
ActiveRecord::QueryMethods::WhereChain クラスに associated というメソッドがあります
このメソッドは、引数としてassociationのシンボルを受け取ります
そのassociationを結合し、結合したassociationのidがNULLじゃないレコードだけに絞り込んだRelationを返します
code:rb
Post.where.associated(:author)
# SELECT "posts".* FROM "posts"
# INNER JOIN "authors" ON "authors"."id" = "posts"."author_id"
# WHERE "authors"."id" IS NOT NULL
このプルリクエストの変更前は、associated メソッドが既存の結合タイプを上書きしてしまう問題がありました
たとえば、先程の例に加えて、Postモデルに対して外部結合(たとえばLEFT JOIN)が指定されている場合においても、associatedメソッドを使うと内部結合(INNER JOIN)に上書きされてしまいます
code:rb
Post.left_outer_joins(:author).where.associated(:author)
# SELECT "posts".* FROM "posts"
# INNER JOIN "authors" ON "authors"."id" = "posts"."author_id"
# WHERE "authors"."id" IS NOT NULL
今回の変更により、すでに指定されている結合タイプがある場合はそれを上書きしないようになりました
code:rb
Post.left_outer_joins(:author).where.associated(:author)
# SELECT "posts".* FROM "posts"
# LEFT OUTER JOIN "authors" ON "authors"."id" = "posts"."author_id"
# WHERE "authors"."id" IS NOT NULL
ActionPackに関する変更です
Railsアプリケーションの設定項目のひとつに filter_parameters があります
パスワードやクレジットカード番号など、ログに出力したくないパラメータをフィルタで除外するのに用います。また、Active Recordオブジェクトに対して #inspect を呼び出した際に、データベースの機密性の高い値をフィルタで除外します。
設定した名称のパラメータが "[FILTERED]" という文字列に書き換わります
ただし、リダイレクトURLに付与されたパラメーターの場合は、この設定に指定した名称のパラメータであっても露出したままになっていました
リダイレクトURLに対するフィルターの設定項目として filter_redirect があります
これを設定すると、リダイレクトURLが設定した文字列を含む、または、正規表現にマッチする場合に "[FILTERED]" という文字列に書き換わります
ただし、この設定をするとリダイレクトURLのドメイン名やpathも含めてすべて書き変わってしまいます
今回のプルリクエストでは、リダイレクトURLについても、filter_parameters に指定した名称のパラメータを書き換えるようになりました